/*
*Caso de Teste 3 -
*Sistemas Operacionais II
*
*Segundo Semestre de 2009 - PUC-Campinas
*
*RAFAEL FACANALI     07343452
*/



#include "file.h"

PCB pcb;
cache_blocos cache[TAM_CACHE];
i_node inode;
LAA lista_arquivos_abertos;
descritor descritores1;
descritor descritores2;
descritor descritores3;
descritor descritores4;
descritor descritores5;
descritor descritores6;
buffer_so buffer_SO;
buffer_usuario buffer_arquivo;


/*
 * Programa principal
 */
int main( int argc, char *argv[] )
{

	inode.ultimo_acesso = 48576348;
	inode.ultima_modificacao = 485766348;
	inode.criacao = 3652763;
	inode.dispositivo[0] = 'a';
	inode.dispositivo[1] = 'B';
	inode.dispositivo[2] = 'c';
	inode.idgrupo = 243524;
	inode.idi_node = 14;
	inode.tamanho = 276;
	inode.direto[0] = 32;
	inode.direto[1] = 0;
	inode.direto[2] = 0;
	inode.direto[3] = 0;
	inode.simple = 0;
	inode.doubl = 0;
	inode.triple = 0;
	inode.idproprietario = 1726354;
	inode.bits_protecao[0] = 1;
	inode.bits_protecao[1] = 1;
	inode.bits_protecao[2] = 1;

	buffer_SO.num_bloco = 31;
	for(int i = 0; i<1024; i++){
		if(i%5 == 0)
			buffer_SO.buffer_so[i] = 'a';
		else if(i%5 == 1)
			buffer_SO.buffer_so[i] = 'B';
		else if(i%5 == 2)
			buffer_SO.buffer_so[i] = 'C';
		else if(i%5 == 3)
			buffer_SO.buffer_so[i] = 'd';
		else
			buffer_SO.buffer_so[i] = 'E';
	}

	descritores1.aberto = 1;
	descritores1.buffer_arquivo = &buffer_SO;
	descritores1.modo_abertura = MODO_AB_WR;
	descritores1.ponteiro_LAA = &lista_arquivos_abertos;
	descritores1.precisa_gravar_cache_blocos = 0;

	descritores2.aberto = 0;
	descritores2.buffer_arquivo = &buffer_SO;
	descritores2.modo_abertura = MODO_AB_READ;
	descritores2.ponteiro_LAA = 0;
	descritores2.precisa_gravar_cache_blocos = 0;

	descritores3.aberto = 0;
	descritores3.buffer_arquivo = &buffer_SO;
	descritores3.modo_abertura = MODO_AB_WRITE;
	descritores3.ponteiro_LAA = 0;
	descritores3.precisa_gravar_cache_blocos = 0;

	descritores4.aberto = 1;
	descritores4.buffer_arquivo = &buffer_SO;
	descritores4.modo_abertura = MODO_AB_WRITE;
	descritores4.ponteiro_LAA = &lista_arquivos_abertos;
	descritores4.precisa_gravar_cache_blocos = 0;

	descritores5.aberto = 0;
	descritores5.buffer_arquivo = &buffer_SO;
	descritores5.modo_abertura = MODO_AB_WR;
	descritores5.ponteiro_LAA = 0;
	descritores5.precisa_gravar_cache_blocos = 0;

	descritores6.aberto = 0;
	descritores6.buffer_arquivo = &buffer_SO;
	descritores6.modo_abertura = MODO_AB_WR;
	descritores6.ponteiro_LAA = 0;
	descritores6.precisa_gravar_cache_blocos = 0;

	cache[65].bloco = 32;
	for(int i = 0; i<1024; i++)
	{
		if(i%6 == 0)
			cache[65].conteudo[i] = 'z';
		else if(i%6 == 1)
			cache[65].conteudo[i] = 'Y';
		else if(i%6 == 2)
			cache[65].conteudo[i] = 'x';
		else if(i%6 == 3)
			cache[65].conteudo[i] = 'w';
		else if(i%6 == 4)
			cache[65].conteudo[i] = 'V';
		else
			cache[65].conteudo[i] = 'U';
	}



	lista_arquivos_abertos.idi_node = 14;
	lista_arquivos_abertos.quant_proc_acessando = 0;
	lista_arquivos_abertos.inode = inode;
	lista_arquivos_abertos.prox = NULL;

	pcb.idgrupo = 243524;
	pcb.idusuario = 1726354;
	pcb.pid = 3456;
	pcb.tabela_descritores[0] = descritores1;
	pcb.tabela_descritores[1] = descritores2;
	pcb.tabela_descritores[2] = descritores3;
	pcb.tabela_descritores[3] = descritores4;
	pcb.tabela_descritores[4] = descritores5;
	for(int j = 5; j<20; j++)
		pcb.tabela_descritores[j] = descritores6;



	printf("\nCASO_DE_TESTE3\n");

	int retorno;

	printf("\nread chamada\n");
	retorno = read(0, &buffer_arquivo, 10, 277);



	//verificando retorno
	if(retorno == -1){
		printf("\nDESCRITOR DE ARQUIVO NAO EXISTENTE\nPID do processo: %d\n\n", pcb.pid);
	}
	else if(retorno == -2){
		printf("\nDESCRITOR DE ARQUIVO NAO ABERTO\nPID do processo: %d\n\n", pcb.pid);
	}
	else if(retorno == -3){
		printf("\nPOSICAO INCORRETA DE LEITURA (POSICAO MAIOR QUE O TAMANHO DO ARQUIVO)\nPID do processo: %d\n\n", pcb.pid);
	}
	else if(retorno == -4){
		printf("\nUSUARIO NAO TEM PERMISSAO PARA LER ARQUIVO MODO DE ABERTURA = WRITE\nPID do processo: %d\n\n", pcb.pid);
	}
	else if(retorno == -5){
		printf("\nDRIVER NAO CONSEGUE REALIZAR LEITURA, BLOCO DANIFICADO ENCONTRADO\nPID do processo: %d\n\n", pcb.pid);
	}
	else if(retorno == -6){
		printf("\nERRO DO USUARIO - QUANTIDADE DE BYTES MENOR QUE 0\nPID do processo: %d\n\n", pcb.pid);
	}
	else if(retorno == -7){
		printf("\nERRO DO USUARIO - POSICAO DE LEITURA MENOR QUE 0\nPID do processo: %d\n\n", pcb.pid);
	}
	else{
		printf("\nLEITURA REALIZADA COM SUCESSO!!!\n\n");
	}
}
